<?php
if(!defined('READY2BLUE'))
	exit();
define('K',1024);
define('M',1048576);
define('G',1073741824);
class FileTools
{
	public static function RmDir($dir)
	{
		if(!$dirH=@opendir($dir))
			return false;
		while(false!==($file=readdir($dirH)))
		{
			if($file=='.'||$file=='..')
				continue;
			if(is_dir($dir.'/'.$file))
			{
				self::RmDir($dir.'/'.$file);
			}
			else
			{
				@unlink($dir.'/'.$file);
			}
		}
		@closedir($dirH);
		return @rmdir($dir);
	}
	public static function CopyDir($dir,$dest)
	{
		if(!is_dir($dest))
		{
			if(!@mkdir($dest))
			{
				return false;
			}
		}
		if(!$dirH=@opendir($dir))
			return false;
		while(false!==($file=readdir($dirH)))
		{
			if($file=='.'||$file=='..')
			{
				continue;
			}
			if(is_dir($dir.'/'.$file))
			{
				self::CopyDir($dir.'/'.$file,$dest.'/'.$file);
			}
			elseif(is_file($dir.'/'.$file))
			{
				@copy($dir.'/'.$file,$dest.'/'.$file);
			}
		}
		closedir($dirH);
		return true;
	}
	public static function ListFileInfo($dir)
	{
		$allFileInfo=array();
		if(!$dirH=@opendir($dir))
			return array();
		while (false!==($file=readdir($dirH))) 
		{
			if($file=='.'||$file=='..'||is_dir($dir.'/'.$file))	
				continue;
			if(is_file($dir.'/'.$file))
			{
				$fileInfo=stat($dir.'/'.$file);
				$fileInfo['filename']=$file;
				$fileInfo['formatsize']=self::FormatSize($fileInfo['size']);
			}
			$allFileInfo[]=$fileInfo;
		}
		closedir($dirH);
		return $allFileInfo;
	}
	public static function ListDirInfo($dir)
	{
		$allDirInfo=array();
		if(!$dirH=@opendir($dir))
			return array();
		while (false!==($file=readdir($dirH))) 
		{
			if($file=='.'||$file=='..'||is_file($dir.'/'.$file))
				continue;
			if(is_dir($dir.'/'.$file))
			{
				
				$dirInfo=array();
				$dirInfo['dirname']=$file;
				$allDirInfo[]=$dirInfo;
			}
		}
		closedir($dirH);
		return $allDirInfo;
	}
	public static function FormatSize($size)
	{
		if($size<K)
			return $size.'B';
		if($size<M)
			return sprintf('%.2fKB',$size/K);
		if($size<G)
			return sprintf('%.2fMB',$size/M);
		return sprintf('%.2fGB',$size/G);
	}
	public static function FileExt($filename)
	{
		return substr(strrchr($filename,'.'),1);
	}
	public static function IsZip($filename)
	{
		return strtolower(self::FileExt($filename))=='zip';
	}
	public static function FileName($filename)
	{
		$filename=str_replace('\\','/',$filename);
		if(strpos($filename,'/')===false)
			return $filename;
		return substr(strrchr($filename,'/',1));
	}
	public static function FormatPerm($perm,$format='rwx')
	{
		if($format=='oct')
		{
			return substr(sprintf('%o', $perm), -4);
		}
		else
		{
			$perms=$perm;
			if (($perms & 0xC000) == 0xC000) {
			   // Socket
			   $info = 's';
			} elseif (($perms & 0xA000) == 0xA000) {
			   // Symbolic Link
			   $info = 'l';
			} elseif (($perms & 0x8000) == 0x8000) {
			   // Regular
			   $info = '-';
			} elseif (($perms & 0x6000) == 0x6000) {
			   // Block special
			   $info = 'b';
			} elseif (($perms & 0x4000) == 0x4000) {
			   // Directory
			   $info = 'd';
			} elseif (($perms & 0x2000) == 0x2000) {
			   // Character special
			   $info = 'c';
			} elseif (($perms & 0x1000) == 0x1000) {
			   // FIFO pipe
			   $info = 'p';
			} else {
			   // Unknown
			   $info = 'u';
			}
			
			// Owner
			$info .= (($perms & 0x0100) ? 'r' : '-');
			$info .= (($perms & 0x0080) ? 'w' : '-');
			$info .= (($perms & 0x0040) ?
			           (($perms & 0x0800) ? 's' : 'x' ) :
			           (($perms & 0x0800) ? 'S' : '-'));
			
			// Group
			$info .= (($perms & 0x0020) ? 'r' : '-');
			$info .= (($perms & 0x0010) ? 'w' : '-');
			$info .= (($perms & 0x0008) ?
			           (($perms & 0x0400) ? 's' : 'x' ) :
			           (($perms & 0x0400) ? 'S' : '-'));
			
			// World
			$info .= (($perms & 0x0004) ? 'r' : '-');
			$info .= (($perms & 0x0002) ? 'w' : '-');
			$info .= (($perms & 0x0001) ?
			           (($perms & 0x0200) ? 't' : 'x' ) :
			           (($perms & 0x0200) ? 'T' : '-'));
			return $info;
		}
	}
	public static function DirSize($dir)
	{
		if(!$dirH=@opendir($dir))
			return 0;
		$size=0;
		while (false!==$file=readdir($dirH))
		{
			if($file=='.'||$file=='..')
			{
				continue;
			}
			if(is_file($dir.'/'.$file))
			{
				$size+=filesize($dir.'/'.$file);
			}
			elseif(is_dir($dir.'/'.$file))
			{
				$size+=self::DirSize($dir.'/'.$file);
			}
		}
		closedir($dirH);
		return $size;
	}
}
?>